#include <bits/stdc++.h>
using namespace std;

/*
2348. 全 0 子数组的数目
已解答
中等
相关标签
premium lock icon
相关企业
提示
给你一个整数数组 nums ，返回全部为 0 的 子数组 数目。

子数组 是一个数组中一段连续非空元素组成的序列。

 

示例 1：

输入：nums = [1,3,0,0,2,0,0,4]
输出：6
解释：
子数组 [0] 出现了 4 次。
子数组 [0,0] 出现了 2 次。
不存在长度大于 2 的全 0 子数组，所以我们返回 6 。
示例 2：

输入：nums = [0,0,0,2,0,0]
输出：9
解释：
子数组 [0] 出现了 5 次。
子数组 [0,0] 出现了 3 次。
子数组 [0,0,0] 出现了 1 次。
不存在长度大于 3 的全 0 子数组，所以我们返回 9 。
示例 3：

输入：nums = [2,10,2019]
输出：0
解释：没有全 0 子数组，所以我们返回 0 。
 

提示：

1 <= nums.length <= 105
-109 <= nums[i] <= 109
*/

// 法一
class Solution {
public:
    using ll = long long;
    long long zeroFilledSubarray(vector<int>& nums) {
        ll ans = 0;             // 结果容器
        int curZeroLen = 0;     // 当前连续0的长度

        for (int num : nums) {
            // 遇到0 ++
            if (num == 0)   curZeroLen++;
            else {
                // 非0  计算当前的连续0片段 记录下来 累加 重置 迭代算下一个片段
                // k的连续0  k* (k + 1) / 2
                ans += (ll)curZeroLen * (curZeroLen + 1) / 2;
                // 重置
                curZeroLen = 0;
            }
        }

        // 末尾处检查一下
        ans += (ll)curZeroLen * (curZeroLen + 1) / 2;
        return ans;
    }
};

// 法二
// 没有那么多考虑情况 也能过
class Solution {
public:
    long long zeroFilledSubarray(vector<int>& nums) {
        long long ans = 0;
        int c = 0;
        for(int num : nums){
            if(num) c = 0;
            else ans += ++c;
        }
        return ans;
    }
};
